const { Middleware, serviceEvent } = require('./libs/core');
const { cloudFunctionService } = require('./libs/middleware');

/**
 * 需要代理的函数输入输出控制器
 */
class Controller {
  /**
   * 需要代理的函数的输入输出控制器
   */
  constructor(...args) {
    this.init(...args);
    /**
     * 临时中间件存储
     */
    this.middlewares = [];
    /**
     * 全部中间件存储
     */
    this.middlewareObject = null;
  }

  /**
   * 初始化控制器（处理必要数据）
   */
  init(...args) {
    /**
     * 控制器上下文
     */
    this.ctx = {
      /**
       * 输入数据 传入需要代理的函数的数据
       */
      input: args,
      /**
       * 输出数据 需要代理的函数的返回数据
       */
      output: {
        /**
         * 需要代理的函数的返回参数
         */
        body: null
      },
      app: serviceEvent
    };
  }

  /**
   * 注册中间件
   * @param {*} middleware 中间件函数
   * @param {*} type 中间件使用位置，支持 MiddlewareType 里的类型
   */
  use(middleware = () => { }) {
    this.middlewares.push(middleware)
  }

  toPromise(cb, ...args) {
    return new Promise((resolve, reject) => {
      try {
        cb(args.pop(), resolve, ...args);
      } catch (error) {
        reject(error);
      }
    });
  }

  /**
   * 创建业务逻辑处理函数
   * @param {*} mainService 业务逻辑处理函数
   * @returns Promise
   */
  async createService(mainService) {
    return new Promise(resolve => {
      (async () => {
        this.middlewareObject = Middleware(...this.middlewares, cloudFunctionService(mainService));
        this.ctx.app.on('error', (error) => {
          console.log(error);
        });
        console.log('开始执行中间件');
        await this.middlewareObject.execute(this.ctx);
        console.log('结束执行中间件');
        resolve(this.ctx.output.body);
        console.log('结束所有执行');
      })();
    });
  }

}
module.exports = {
  Controller
}